#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
日志配置模块
统一管理系统的日志配置，避免重复配置和重复输出
"""

import logging
import os
from pathlib import Path
from typing import Optional

# 全局标志，用于防止重复配置
_logging_configured = False

def configure_logging_once(log_level: str = "INFO", 
                          log_file: str = "system.log",
                          console_output: bool = True,
                          file_output: bool = True) -> bool:
    """
    配置日志系统，确保只配置一次
    
    Args:
        log_level: 日志级别
        log_file: 日志文件名
        console_output: 是否输出到控制台
        file_output: 是否输出到文件
        
    Returns:
        bool: 配置是否成功
    """
    global _logging_configured
    
    if _logging_configured:
        return True
        
    try:
        # 获取根日志器
        root_logger = logging.getLogger()
        
        # 如果已经有处理器，先清除
        if root_logger.handlers:
            for handler in root_logger.handlers[:]:
                root_logger.removeHandler(handler)
        
        # 设置根日志器级别
        root_logger.setLevel(getattr(logging, log_level.upper(), logging.INFO))
        
        # 创建格式化器
        formatter = logging.Formatter(
            '%(asctime)s - %(name)s - %(levelname)s - %(message)s',
            datefmt='%Y-%m-%d %H:%M:%S'
        )
        
        # 配置控制台输出
        if console_output:
            console_handler = logging.StreamHandler()
            console_handler.setLevel(getattr(logging, log_level.upper(), logging.INFO))
            console_handler.setFormatter(formatter)
            root_logger.addHandler(console_handler)
        
        # 配置文件输出
        if file_output:
            try:
                # 确保日志目录存在
                log_dir = Path(log_file).parent
                if log_dir and not log_dir.exists():
                    log_dir.mkdir(parents=True, exist_ok=True)
                
                file_handler = logging.FileHandler(log_file, encoding='utf-8')
                file_handler.setLevel(logging.DEBUG)  # 文件记录更详细的日志
                file_handler.setFormatter(formatter)
                root_logger.addHandler(file_handler)
            except Exception as e:
                print(f"配置文件日志失败: {e}")
        
        # 设置第三方库的日志级别，避免过多输出
        logging.getLogger('urllib3').setLevel(logging.WARNING)
        logging.getLogger('requests').setLevel(logging.WARNING)
        logging.getLogger('PIL').setLevel(logging.WARNING)
        
        # 标记为已配置
        _logging_configured = True
        
        return True
        
    except Exception as e:
        print(f"配置日志系统失败: {e}")
        _logging_configured = True  # 避免无限重试
        return False

def get_logger(name: str, level: Optional[str] = None) -> logging.Logger:
    """
    获取指定名称的日志器
    
    Args:
        name: 日志器名称
        level: 日志级别（可选）
        
    Returns:
        logging.Logger: 日志器实例
    """
    logger = logging.getLogger(name)
    
    if level:
        logger.setLevel(getattr(logging, level.upper(), logging.INFO))
    
    return logger

def reset_logging_config():
    """
    重置日志配置（主要用于测试）
    """
    global _logging_configured
    _logging_configured = False
    
    # 清除根日志器的所有处理器
    root_logger = logging.getLogger()
    for handler in root_logger.handlers[:]:
        root_logger.removeHandler(handler)

def is_logging_configured() -> bool:
    """
    检查日志是否已经配置
    
    Returns:
        bool: 是否已配置
    """
    return _logging_configured
